package com.hspedu.furns.service.impl;

import com.hspedu.furns.dao.FurnDAO;
import com.hspedu.furns.dao.OrderDAO;
import com.hspedu.furns.dao.OrderItemDAO;
import com.hspedu.furns.dao.impl.FurnDAOImpl;
import com.hspedu.furns.dao.impl.OrderDAOImpl;
import com.hspedu.furns.dao.impl.OrderItemDAOImpl;
import com.hspedu.furns.entity.*;
import com.hspedu.furns.service.OrderService;

import java.math.BigDecimal;
import java.util.*;

/**
 * @author 徐
 * @version 1.0
 */
public class OrderServiceImpl implements OrderService {
    //定义OrderDAO 对象
    private OrderDAO orderDAO = new OrderDAOImpl();
    //定义OrderItemDAO对象
    private OrderItemDAO orderItemDAO = new OrderItemDAOImpl();
    //定义FurnDAO对象
    private FurnDAO furnDAO = new FurnDAOImpl();


    /**
     * 生成订单信息，并添加到数据库
     * 1. 生成订单
     * 2. 订单是根据cart来生成, cart对象在session,通过web层，传入saveOrder
     * 3. 订单是和一个会员关联
     * @param cart
     * @param memberId
     * @return
     */
    @Override
    public String saveOrder(Cart cart, int memberId) {
        //这里的业务逻辑相对综合
        //完成任务时将 cart购物车的数据->以order和 orderItem形式保存到db
        //说明：因为生成订单会操作多表，因此会涉及到多表事务的问题 ThreadLocal+Mysql事务机制+过滤器
        //关于事务的处理，考虑的点比较多，老师后面专门处理

        //1. 通过cart对象, 构建对应的Order对象
        //先生成一个UUID, 表示当前的订单号, 订单号要保证是唯一
        String orderId = System.currentTimeMillis() + "" + memberId;
        //获取订单价格
        BigDecimal cartTotalPrice = cart.getCartTotalPrice();
        //创建Order对象
        Order order = new Order(orderId, new Date(), cartTotalPrice, 0, memberId);
        //调用DAO对象
        orderDAO.saveOrder(order);

        //2.通过cart对象 ,遍历出CartItem, 构建OrderItem对象， 并保存到对应的表order_item
        //CartItem 对象对应 OrderItem
        HashMap<Integer, CartItem> items = cart.getItems();
        //方式1：遍历集合->通过key取出value
        Set<Integer> keys = items.keySet();
        for (Integer id : keys) {
            CartItem cartItem = items.get(id);
            //将 cartItem -> OrderItem
            OrderItem orderItem = new OrderItem(null, cartItem.getName(),
                    cartItem.getPrice(), cartItem.getCount(), cartItem.getTotalPrice(), orderId);

            //调用DAO层保存orderItem
            orderItemDAO.saveOrderItem(orderItem);
            //3.把furn表的销量和库存进行修改
            //获取到furn对象
            Furn furn = furnDAO.queryFurnById(id);
            //修改库存和销量
            furn.setSales(furn.getSales() + cartItem.getCount());
            furn.setStock(furn.getStock() - cartItem.getCount());
            //执行更新操作
            furnDAO.updateFurn(furn);
        }
        /*
        //方式2：通过entryset的方式遍历items 取出CartItem===
        for (Map.Entry<Integer, CartItem> entry : cart.getItems().entrySet()) {
            CartItem item = entry.getValue();
            //通过cartItem对象构建了OrderItem
            OrderItem orderItem = new OrderItem(null, item.getName(), item.getPrice(),
                    item.getCount(), item.getTotalPrice(), orderId);

            //保存
            orderItemDAO.saveOrderItem(orderItem);

            //更新一把furn表的sales销量, stock存量
            //(1) 获取到furn对象
            Furn furn = furnDAO.queryFurnById(item.getId());
            //(2) 更新一下这个furn的sales销量, stock存量
            furn.setSales(furn.getSales() + item.getCount());
            furn.setStock(furn.getStock() - item.getCount());
            //(3) 更新到数据表
            furnDAO.updateFurn(furn);

        }
         */

        //生成订单信息后完后清空购物车
        cart.clearItem();
        return orderId;

    }

    /**
     * 查询订单信息
     * @param id
     * @return 不为null，返回order对象
     */
    @Override
    public Order showOrder(String id) {
        return orderDAO.showOrder(id);
    }

    /**
     * 根据订单id查询订单项
     * 订单详细信息，每种家居记录
     * @param id
     * @return
     */
    @Override
    public List<OrderItem> showOrderItem(String id) {
        return orderItemDAO.showOrderItem(id);
    }

    /**
     * 查询所有订单记录，用于展示
     * @return
     */
    @Override
    public List<Order> queryOrders() {
        return orderDAO.queryOrders();
    }
}
